package tsli.acm.biz;

import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.util.Map;

import tsli.acm.dao.AgentDebtDAO;
import tsli.acm.database.Database;

public class AgentDebtManagement {

	public static void main(String[] args) {
		AgentDebtManagement voADM = new AgentDebtManagement();
		String vaPeNo = "221300183";// 221400217, 221300183;
		double[] vnBonus = {85381.08};
		Database db = new Database();
		String[] vaResult = voADM.CalAgentDebt(vaPeNo, vnBonus, db);
		db.close();
		for (int i = 0; i < vaResult.length; i++)
			System.out.println(vaResult[i]);
	}
	
	/**
	 * calculate agent debt
	 * @param paPeNo pe_no who will find agent debt
	 * @param pnBonus bonus point in each paying
	 * @return adjusted bonus in each paying and message for note
	 */
	public String[] CalAgentDebt(String paPeNo, double[] pnBonus, Database db) {
		//credit, pe_no_sm, pe_no_mm, pe_no_bm
		DecimalFormat df = new DecimalFormat("#,##0.00");
		AgentDebtDAO voAD = new AgentDebtDAO(db);
		Map<String, Object> voResult = voAD.findDebtByPeNo(paPeNo);
		if (voResult == null) {
			String[] vaResult = new String[pnBonus.length + 2];
			for (int i = 0; i < pnBonus.length; i++) 
				vaResult[i] = Double.toString(pnBonus[i]);
			vaResult[pnBonus.length] = "-";
			vaResult[pnBonus.length + 1] = "0";
			return vaResult;
		}
		double vnCredit = ((BigDecimal) voResult.get("CREDIT")).doubleValue();
		String[] vaParent = {(String) voResult.get("PE_NO_SM"), 
				(String) voResult.get("PE_NO_MM"), (String) voResult.get("PE_NO_BM")};
//		String vaClosYM = (String) voResult.get("CLOS_YM");
		// month vaClosYM.substring(4, 6)
		// year vaClosYM.substring(0, 4)
		double[] vnResult = new double[pnBonus.length];
		String[] vaResult = new String[pnBonus.length + 2];
//		String[] vaResult = new String[pnBonus.length + 4];
//		String vaTmp = vaClosYM.substring(4, 6); 
//		if (vaTmp.equals("01") || vaTmp.equals("02") || vaTmp.equals("03")) vaResult[pnBonus.length+1] = "ไตรมาสที่ 1";
//		else if (vaTmp.equals("04") || vaTmp.equals("05") || vaTmp.equals("06")) vaResult[pnBonus.length+1] = "ไตรมาสที่ 2";
//		else if (vaTmp.equals("07") || vaTmp.equals("08") || vaTmp.equals("09")) vaResult[pnBonus.length+1] = "ไตรมาสที่ 3";
//		else if (vaTmp.equals("10") || vaTmp.equals("11") || vaTmp.equals("12")) vaResult[pnBonus.length+1] = "ไตรมาสที่ 4";
//		vaResult[pnBonus.length+2] = vaClosYM.substring(0, 4);
//		vaResult[pnBonus.length+3] = df.format(vnCredit);
		double vnOwner = pnBonus[0] - vnCredit;
		String vaPrint = "";
		//System.out.println(pnBonus[0] + " " + vnCredit + " " + vnOwner + " " + (vnOwner*-1));
		if (vnOwner >= 0) {
			vaPrint = "Agent คนนี้มีหนี้อยู่และสามารถจ่ายหนี้ได้เองทั้งจำนวนเป็นเงิน: " + df.format(vnCredit) + " บาท" +
					" ทำให้ถูกหักในเดือนที่จ่ายโบนัสเดือนที่ 1 คงเหลือ: " + df.format((pnBonus[0] - vnCredit)) + " บาท";
			// ทำให้เหลือโบนัสในเดือนที่ 1 ที่จะได้รับ
			vnResult[0] = vnOwner;
			vaResult[pnBonus.length] = vaPrint;
			for (int i = 0; i < pnBonus.length; i++) {
				if (vnResult[i] != 0) {
					vaResult[i] = Double.toString(vnResult[i]);
				} else {
					vaResult[i] = Double.toString(pnBonus[i]);
				}
			}
			vaResult[pnBonus.length + 1] = df.format(vnCredit);
			return vaResult;
//		} else if (vnOwner < 0) {
//			vaPrint = "Agent คนนี้มีหนี้และโบนัสที่ทำในเดือนนี้มีการติดลบทำให้ยอดหนี้มีการเพิ่มขึ้นเป็นเงิน: " + df.format(vnCredit + Math.abs(pnBonus[0])) + " บาท" +
//					" โดยแบ่งเป็นหนี้ครั้งก่อนคือ: " + df.format(vnCredit) + " บาท และหนี้ครั้งปัจจุบันคือ: " + df.format(Math.abs(pnBonus[0])) + " บาท" ;
//			vnResult[0] = vnOwner;
//			vaResult[pnBonus.length] = vaPrint;
//			for (int i = 0; i < pnBonus.length; i++) {
//				if (vnResult[i] != 0) {
//					vaResult[i] = Double.toString(vnResult[i]);
//				} else {
//					vaResult[i] = Double.toString(pnBonus[i]);
//				}
//			}
//			return vaResult;
		} else {
			int count = 1;
			vnOwner = vnOwner*-1;
			vaPrint = "Agent มีหนี้สินจำนวน: " + df.format(vnCredit) + " บาท ซึ่งไม่สามารถจ่ายหมดได้ภายในครั้งเดียวทำให้สายงานต้องร่วมรับผิดชอบด้วยดังนี้";
			// จ่ายคนเดียวไม่หมด
			if (vaParent[0] != null) { // SM(AL) จ่าย 30%
				vaPrint += "\n<br>หัวหน้าตำแหน่ง   AL จะต้องจ่าย 30% คือรหัส: " + vaParent[0] + " โดยจ่ายเงินเป็นจำนวน: " + df.format(vnOwner*0.3) + " บาท";
				vnOwner = vnOwner - (vnOwner*0.3);
			}
			if (vaParent[1] != null) { // MM(AVL) จ่าย 20%
				vaPrint += "\n<br>หัวหน้าตำแหน่ง AVP จะต้องจ่าย 20% คือรหัส: " + vaParent[1] + " โดยจ่ายเงินเป็นจำนวน: " + df.format(vnOwner*0.2) + " บาท";
				vnOwner = vnOwner - (vnOwner*0.2);
			}
			if (vaParent[2] != null) { // BM(VP) จ่าย 10%
				vaPrint += "\n<br>หัวหน้าตำแหน่ง   GM จะต้องจ่าย 10% คือรหัส: " + vaParent[2] + " โดยจ่ายเงินเป็นจำนวน: " + df.format(vnOwner*0.1) + " บาท";
				vnOwner = vnOwner - (vnOwner*0.1);
			}
			//System.out.println("คงเหลือจากการหักสายงาน: " + vnOwner);
			vaResult[0] = "0";
			for (int i = 1; i < pnBonus.length; i++) {
				if ((pnBonus[i] - vnOwner) >= 0) {
					vaResult[i] = Double.toString((pnBonus[i] - vnOwner));
					vnOwner = 0;
				} else {
					vaResult[i] = "0";
					vnOwner = vnOwner - pnBonus[i];
					count++;
				}
			}
			vaPrint += "\n<br>Agent คนนี้ต้องถูกหักเงินโบนัสเป็นเวลา " + count + " เดือน";
			if (vnOwner > 0) {
				vaPrint += "และยังเหลือหนี้คงค้างอยู่อีกเป็นจำนวนเงิน: " + df.format(vnOwner) + " บาท";
			}
			vaResult[pnBonus.length] = vaPrint;
		}
		vaResult[pnBonus.length + 1] = df.format(vnCredit);
		return vaResult;
	}
	
	public String[] CalAgentDebt(String paPeNo, double[] pnBonus, Database db, String paQuarter, String paYear) {
		//credit, pe_no_sm, pe_no_mm, pe_no_bm
		DecimalFormat df = new DecimalFormat("#,##0.00");
		AgentDebtDAO voAD = new AgentDebtDAO(db);
		Map<String, Object> voResult = voAD.findDebtByPeNo(paPeNo, paQuarter, paYear);
		if (voResult == null) {
			String[] vaResult = new String[pnBonus.length + 4];
			for (int i = 0; i < pnBonus.length; i++) 
				vaResult[i] = Double.toString(pnBonus[i]);
			vaResult[pnBonus.length + 3] = "0";
			vaResult[pnBonus.length + 2] = paYear;
			vaResult[pnBonus.length + 1] = "ไตรมาสที่ " + paQuarter;
			vaResult[pnBonus.length] = "-";
			return vaResult;
		}
		double vnCredit = ((BigDecimal) voResult.get("CREDIT")).doubleValue();
		String[] vaParent = {(String) voResult.get("PE_NO_SM"), 
				(String) voResult.get("PE_NO_MM"), (String) voResult.get("PE_NO_BM")};
		String vaClosYM = (String) voResult.get("CLOS_YM");
		// month vaClosYM.substring(4, 6)
		// year vaClosYM.substring(0, 4)
		double[] vnResult = new double[pnBonus.length];
		//String[] vaResult = new String[pnBonus.length + 1];
		String[] vaResult = new String[pnBonus.length + 4];
		String vaTmp = vaClosYM.substring(4, 6); 
		if (vaTmp.equals("01") || vaTmp.equals("02") || vaTmp.equals("03")) vaResult[pnBonus.length+1] = "ไตรมาสที่ 1";
		else if (vaTmp.equals("04") || vaTmp.equals("05") || vaTmp.equals("06")) vaResult[pnBonus.length+1] = "ไตรมาสที่ 2";
		else if (vaTmp.equals("07") || vaTmp.equals("08") || vaTmp.equals("09")) vaResult[pnBonus.length+1] = "ไตรมาสที่ 3";
		else if (vaTmp.equals("10") || vaTmp.equals("11") || vaTmp.equals("12")) vaResult[pnBonus.length+1] = "ไตรมาสที่ 4";
		vaResult[pnBonus.length+2] = vaClosYM.substring(0, 4);
		vaResult[pnBonus.length+3] = df.format(vnCredit);
		double vnOwner = pnBonus[0] - vnCredit;
		String vaPrint = "";
		//System.out.println(pnBonus[0] + " " + vnCredit + " " + vnOwner + " " + (vnOwner*-1));
		if (vnOwner >= 0) {
			vaPrint = "Agent คนนี้มีหนี้อยู่และสามารถจ่ายหนี้ได้เองทั้งจำนวนเป็นเงิน: " + df.format(vnCredit) + " บาท" +
					" ทำให้ถูกหักในเดือนที่จ่ายโบนัสเดือนที่ 1 คงเหลือ: " + df.format((pnBonus[0] - vnCredit)) + " บาท";
			// ทำให้เหลือโบนัสในเดือนที่ 1 ที่จะได้รับ
			vnResult[0] = vnOwner;
			vaResult[pnBonus.length] = vaPrint;
			for (int i = 0; i < pnBonus.length; i++) {
				if (vnResult[i] != 0) {
					vaResult[i] = Double.toString(vnResult[i]);
				} else {
					vaResult[i] = Double.toString(pnBonus[i]);
				}
			}
			return vaResult;
		} else {
			int count = 1;
			vnOwner = vnOwner*-1;
			vaPrint = "Agent มีหนี้สินจำนวน: " + df.format(vnCredit) + " บาท ซึ่งไม่สามารถจ่ายหมดได้ภายในครั้งเดียวทำให้สายงานต้องร่วมรับผิดชอบด้วยดังนี้";
			// จ่ายคนเดียวไม่หมด
			if (vaParent[0] != null) { // SM(AL) จ่าย 30%
				vaPrint += "\n<br>หัวหน้าตำแหน่ง   AL จะต้องจ่าย 30% คือรหัส: " + vaParent[0] + " โดยจ่ายเงินเป็นจำนวน: " + df.format(vnOwner*0.3) + " บาท";
				vnOwner = vnOwner - (vnOwner*0.3);
			}
			if (vaParent[1] != null) { // MM(AVL) จ่าย 20%
				vaPrint += "\n<br>หัวหน้าตำแหน่ง AVP จะต้องจ่าย 20% คือรหัส: " + vaParent[1] + " โดยจ่ายเงินเป็นจำนวน: " + df.format(vnOwner*0.2) + " บาท";
				vnOwner = vnOwner - (vnOwner*0.2);
			}
			if (vaParent[2] != null) { // BM(VP) จ่าย 10%
				vaPrint += "\n<br>หัวหน้าตำแหน่ง   GM จะต้องจ่าย 10% คือรหัส: " + vaParent[2] + " โดยจ่ายเงินเป็นจำนวน: " + df.format(vnOwner*0.1) + " บาท";
				vnOwner = vnOwner - (vnOwner*0.1);
			}
			//System.out.println("คงเหลือจากการหักสายงาน: " + vnOwner);
			vaResult[0] = "0";
			for (int i = 1; i < pnBonus.length; i++) {
				if ((pnBonus[i] - vnOwner) >= 0) {
					vaResult[i] = Double.toString((pnBonus[i] - vnOwner));
					vnOwner = 0;
				} else {
					vaResult[i] = "0";
					vnOwner = vnOwner - pnBonus[i];
					count++;
				}
			}
			vaPrint += "\n<br>Agent คนนี้ต้องถูกหักเงินโบนัสเป็นเวลา " + count + " เดือน";
			if (vnOwner > 0) {
				vaPrint += "และยังเหลือหนี้คงค้างอยู่อีกเป็นจำนวนเงิน: " + df.format(vnOwner) + " บาท";
			}
			vaResult[pnBonus.length] = vaPrint;
		}
		return vaResult;
	}

}
